#!/usr/bin/env python3
"""
RBAC权限系统数据迁移脚本
基于用户提供的数据库设计
"""

from flask import Flask
from tools.db import create_database, init_db
from models.users import AdminUser, Role, Resource, Permission, user_roles, role_permissions, user_resources
import sys

def migrate_rbac_data():
    """迁移RBAC权限系统数据"""
    print("开始RBAC权限系统数据迁移")
    print("=" * 50)
    
    try:
        # 1. 创建数据库
        print("步骤1: 创建MySQL数据库")
        if not create_database():
            print("数据库创建失败")
            return False
        print("数据库创建成功")
        
        # 2. 初始化Flask应用
        print("\n步骤2: 初始化Flask应用")
        app = Flask(__name__)
        db = init_db(app, use_mysql=True)
        print("Flask应用初始化成功")
        
        # 3. 创建所有表
        print("\n步骤3: 创建数据库表")
        with app.app_context():
            db.create_all()
            
            # 显示创建的表
            inspector = db.inspect(db.engine)
            tables = inspector.get_table_names()
            print(f"成功创建 {len(tables)} 个表:")
            for table in tables:
                print(f"   - {table}")
        
        # 4. 初始化基础数据
        print("\n步骤4: 初始化基础数据")
        with app.app_context():
            # 清空现有数据
            print("清空现有数据...")
            db.session.query(user_resources).delete()
            db.session.query(role_permissions).delete()
            db.session.query(user_roles).delete()
            db.session.query(AdminUser).delete()
            db.session.query(Permission).delete()
            db.session.query(Resource).delete()
            db.session.query(Role).delete()
            db.session.commit()
            
            # 创建资源数据（完全按照您的设计）
            print("创建资源数据...")
            # 先创建一个虚拟根节点
            root_resource = Resource(id=0, name='根节点', pid=None, level=0, topid=0, url='/', icon='el-icon-home')
            db.session.add(root_resource)
            db.session.flush()
            
            # 再创建顶级资源
            resource1 = Resource(id=1, name='销售管理', pid=0, level=1, topid=0, url='/sales', icon='el-icon-sell')
            resource4 = Resource(id=4, name='商品管理', pid=0, level=1, topid=0, url='/products', icon='el-icon-goods')
            db.session.add(resource1)
            db.session.add(resource4)
            db.session.flush()
            
            # 再创建二级资源
            resource2 = Resource(id=2, name='销售订单', pid=1, level=2, topid=1, url='/sales/orders', icon='el-icon-document')
            db.session.add(resource2)
            db.session.flush()
            
            # 最后创建三级资源
            resource3 = Resource(id=3, name='销售订单新增', pid=2, level=3, topid=1, url='/sales/orders/add', icon='el-icon-plus')
            resource5 = Resource(id=5, name='新增', pid=4, level=3, topid=4, url='/products/add', icon='el-icon-plus')
            db.session.add(resource3)
            db.session.add(resource5)
            db.session.flush()
            
            # 创建角色数据（完全按照您的设计）
            print("创建角色数据...")
            roles = [
                Role(id=1, name='销售', description='销售角色'),
                Role(id=2, name='商品编辑', description='商品编辑角色'),
            ]
            
            for role in roles:
                db.session.add(role)
            db.session.flush()
            
            # 创建权限数据
            print("🔐 创建权限数据...")
            permissions = [
                Permission(id=1, name='销售订单新增权限', resource_id=3, action='create'),
                Permission(id=2, name='商品新增权限', resource_id=5, action='create'),
            ]
            
            for permission in permissions:
                db.session.add(permission)
            db.session.flush()
            
            # 创建用户数据（完全按照您的设计）
            print("创建用户数据...")
            users = [
                AdminUser(id=1, name='zs', mobile='12344400001', roleid=1),
                AdminUser(id=2, name='zs1', mobile='12344400002', roleid=1),
                AdminUser(id=3, name='xm', mobile='12344400003', roleid=2),
            ]
            
            for user in users:
                db.session.add(user)
            db.session.flush()
            
            # 建立角色权限关系（完全按照您的设计）
            print("建立角色权限关系...")
            # 销售角色 -> 销售订单新增权限
            sales_role = Role.query.get(1)
            sales_permission = Permission.query.get(1)
            sales_role.permissions.append(sales_permission)
            
            # 商品编辑角色 -> 商品新增权限
            product_role = Role.query.get(2)
            product_permission = Permission.query.get(2)
            product_role.permissions.append(product_permission)
            
            # 建立用户资源关系（ACL权限 - 完全按照您的设计）
            print("建立用户资源关系...")
            # 用户zs -> 销售订单新增资源 (userid=1, resid=3)
            user_zs = AdminUser.query.get(1)
            sales_order_add_resource = Resource.query.get(3)
            user_zs.resources.append(sales_order_add_resource)
            
            # 用户zs -> 商品新增资源 (userid=1, resid=5)
            product_add_resource = Resource.query.get(5)
            user_zs.resources.append(product_add_resource)
            
            db.session.commit()
            print("基础数据初始化成功")
        
        print("\nRBAC权限系统数据迁移完成！")
        print("数据统计:")
        
        with app.app_context():
            # 统计数据
            user_count = AdminUser.query.count()
            role_count = Role.query.count()
            resource_count = Resource.query.count()
            permission_count = Permission.query.count()
            
            print(f"   ✅ 用户数量: {user_count}")
            print(f"   ✅ 角色数量: {role_count}")
            print(f"   ✅ 资源数量: {resource_count}")
            print(f"   ✅ 权限数量: {permission_count}")
            
            # 显示用户信息（完全按照您的设计）
            print("\n👥 用户信息:")
            users = AdminUser.query.all()
            for user in users:
                role = Role.query.get(user.roleid)
                print(f"   - {user.name} (手机: {user.mobile}, 角色: {role.name if role else '无'})")
            
            # 显示角色权限关系（完全按照您的设计）
            print("\n🔐 角色权限关系:")
            roles = Role.query.all()
            for role in roles:
                permissions = role.permissions.all()
                permission_names = [p.name for p in permissions]
                print(f"   - {role.name}: {', '.join(permission_names) if permission_names else '无权限'}")
            
            # 显示用户资源关系（完全按照您的设计）
            print("\n📁 用户资源关系:")
            for user in users:
                resources = user.resources.all()
                resource_names = [r.name for r in resources]
                print(f"   - {user.name}: {', '.join(resource_names) if resource_names else '无资源'}")
            
            # 显示资源表结构（完全按照您的设计）
            print("\n📋 资源表结构:")
            resources = Resource.query.order_by(Resource.id).all()
            for resource in resources:
                print(f"   ID: {resource.id}, 名称: {resource.name}, PID: {resource.pid}, Level: {resource.level}, TopID: {resource.topid}")
            
            # 显示角色资源表关系（完全按照您的设计）
            print("\n🔗 角色资源表关系:")
            for role in roles:
                # 通过权限获取资源
                permissions = role.permissions.all()
                for permission in permissions:
                    resource = Resource.query.get(permission.resource_id)
                    if resource:
                        print(f"   角色ID: {role.id}, 资源ID: {resource.id}, 资源名称: {resource.name}")
        
        return True
        
    except Exception as e:
        print(f"迁移失败: {str(e)}")
        import traceback
        traceback.print_exc()
        return False

def test_data_relationships():
    """测试数据关系"""
    print("\n🧪 测试数据关系")
    print("=" * 30)
    
    try:
        app = Flask(__name__)
        db = init_db(app, use_mysql=True)
        
        with app.app_context():
            # 测试用户角色关系
            user = AdminUser.query.get(1)
            if user:
                role = Role.query.get(user.roleid)
                print(f"✅ 用户 {user.name} 的角色: {role.name if role else '无'}")
                
                # 测试角色权限关系
                if role:
                    permissions = role.permissions.all()
                    print(f"✅ 角色 {role.name} 的权限: {[p.name for p in permissions]}")
                
                # 测试用户资源关系
                resources = user.resources.all()
                print(f"✅ 用户 {user.name} 的资源: {[r.name for r in resources]}")
            
            print("✅ 数据关系测试通过")
            return True
            
    except Exception as e:
        print(f"❌ 数据关系测试失败: {str(e)}")
        return False

if __name__ == '__main__':
    success = migrate_rbac_data()
    if success:
        test_data_relationships()
        print("\n数据迁移完成，可以启动应用:")
        print("   python app_with_redis.py")
    else:
        print("\n数据迁移失败")
        sys.exit(1)
